import org.apache.spark.{SparkConf, SparkContext}

// 在Scala编程语言中，class和object是两个基本的构建块，它们在定义和实例化对象时扮演着不同的角色。
// class是一个蓝图，用于创建具体的对象实例，它定义了对象的属性和行为。
// 而object在Scala中用于实现单例模式，它本身就是一个实例，通常用于存放静态成员和静态方法。
object WordCount {

  def test1(sc: SparkContext): Unit = {
    val textFile = sc.textFile("D:\\tmp\\input.txt")  // 读取本地文件
    val wordCounts = textFile
      .flatMap(_.split(" "))
      .map(word => (word, 1))
      .reduceByKey(_ + _)
    wordCounts.saveAsTextFile("D:\\tmp\\output")  // 结果保存到 output/
  }

  def test2(sc: SparkContext): Unit = {
    val rdd = sc.parallelize(1 to 30)
    var rdd1 = rdd.groupBy(_%4)
    rdd1.foreach(a=>println(a._1, "the result is ", a._2))
    // (0,CompactBuffer(4, 8, 12, 16, 20, 24, 28))
    // (1,CompactBuffer(1, 5, 9, 13, 17, 21, 25, 29))
    // (3,CompactBuffer(3, 7, 11, 15, 19, 23, 27))
    // (2,CompactBuffer(2, 6, 10, 14, 18, 22, 26, 30))
  }

  def test3(sc: SparkContext): Unit = {
    // 测试map：将一个数组进行拓展，增加对4取模的值作为tuple的第一个值。
    var rdd = sc.parallelize(1 to 100)
    var rdd2 = rdd.map(i => (i%4, i))
    println(rdd2.collect().mkString)
  }

  def test4(sc: SparkContext): Unit = {
    // 测试filter和reduce
    // 将一个数字序列按照对4取模的结果进行分类，然后把各分类的值相加。
    var rdd = sc.parallelize(1.toLong to 1000000000.toLong)
    var rdd2 = rdd.map(i=>(i%4, i))

    var sum0 = rdd2.filter(_._1 == 0).reduce((a, b)=>(0, a._2 + b._2))
    var sum1 = rdd2.filter(_._1 == 1).reduce((a, b)=>(1, a._2 + b._2))
    var sum2 = rdd2.filter(_._1 == 2).reduce((a, b)=>(2, a._2 + b._2))
    var sum3 = rdd2.filter(_._1 == 3).reduce((a, b)=>(3, a._2 + b._2))

    println(sum0)
    println(sum1)
    println(sum2)
    println(sum3)
    println("=======================Finished========================")
  }

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("WordCount").setMaster("local[*]")
    val sc = new SparkContext(conf)
    test2(sc)
    //test4(sc)
    sc.stop()
  }
}

// 直接运行
// cd D:\github\spark-scala-tutorial\xxxxxxxxx
// sbt run
// 或者打包后运行
// sbt package
// spark-submit --class XxxxxXxxx D:\github\spark-scala-tutorial\xxxxxxxxx\target\scala-2.12\xxxxxxxxxxxxxxxxxxx.jar